module apple(
    input clk,                // 时钟信号
    input get_apple,          // 获取苹果的信号
    input [1:0] game_status,  // 游戏状态
    input game_pause,         // 游戏暂停信号
    input [1:0] game_level,   // 游戏等级
    // 输出苹果的坐标
    output reg [5:0] apple_x, // 苹果的X坐标输出
    output reg [5:0] apple_y  // 苹果的Y坐标输出
);

// ************ 参数定义 ***********

// 游戏状态参数
parameter LAUNCHING = 2'b00;    // 启动状态
parameter PLAYING = 2'b01;      // 播放状态
parameter DIE_FLASHING = 2'b10; // 死亡闪烁状态
parameter INITIALIZING = 2'b11; // 初始化状态

// 定义游戏区域的最大X和Y坐标
parameter BLOCK_X_MAX = 7'd79; // 最大X坐标
parameter BLOCK_Y_MAX = 7'd59; // 最大Y坐标

// 计数器和标志位
reg [35:0] cnt = 0;            // 计数器，用于定时
reg apple_change_flag;         // 苹果变化标志位

// 计数器逻辑，每达到50000000 * 60个时钟周期，设置苹果变化标志位
always @(posedge clk) begin
    if (cnt == 36'd50000000 * 60) begin
        apple_change_flag <= 1'b1; // 设置苹果变化标志位
        cnt <= 0;                  // 重置计数器
    end else begin
        cnt <= cnt + 1;            // 计数器递增
        apple_change_flag <= 1'b0; // 清除苹果变化标志位
    end
end

// 随机数生成寄存器
reg [11:0] random_for_x;       // X方向的随机数
reg [11:0] random_for_y;       // Y方向的随机数

// 每个时钟周期更新随机数，并根据游戏状态和等级更新苹果位置
always @(posedge clk) begin
    random_for_x <= random_for_x + 997; // 更新X方向的随机数
    random_for_y <= random_for_y + 793; // 更新Y方向的随机数

    // 初始化或启动状态时，设置苹果的初始位置和随机数种子
    if (game_status == INITIALIZING || game_status == LAUNCHING) begin
        apple_x <= 20;             // 初始X坐标
        apple_y <= 13;             // 初始Y坐标
        random_for_x <= 521;       // 初始X方向随机数种子
        random_for_y <= 133;       // 初始Y方向随机数种子
    end
    // 游戏进行中且未暂停时，根据苹果变化标志位或获取苹果信号更新苹果位置
    else if (game_status == PLAYING && (apple_change_flag || get_apple) && ~game_pause) begin
        // 防止坐标超出范围
        if (game_level == 'd0) begin
            // 根据随机数更新苹果X坐标，防止超出边界
            apple_x <= (random_for_x[4:0] > (BLOCK_X_MAX - 1)) ? (BLOCK_X_MAX - 1) : 
                       (random_for_x[5:0] == 0) ? 6'd1 : 
                       {1'b0, random_for_x[4:0]};
            // 根据随机数更新苹果Y坐标，防止超出边界
            apple_y <= (random_for_y[4:0] > (BLOCK_Y_MAX - 1)) ? (BLOCK_Y_MAX - 1) : 
                       (random_for_y[5:0] == 0) ? 6'd1 : 
                       {1'b0, random_for_y[4:0]};
        end else begin
            // 根据随机数更新苹果X坐标，防止超出边界，并在特定位置调整
            apple_x <= (random_for_x[4:0] > (BLOCK_X_MAX - 1)) ? (BLOCK_X_MAX - 1) : 
                       (random_for_x[5:0] == 0) ? 6'd1 : 
                       (random_for_x[4:0] == BLOCK_X_MAX / 4) ? (BLOCK_X_MAX / 4 - 1) : 
                       (random_for_x[4:0] == BLOCK_X_MAX / 4 * 3) ? (BLOCK_X_MAX / 4 + 1) : 
                       {1'b0, random_for_x[4:0]};
            // 根据随机数更新苹果Y坐标，防止超出边界，并在特定位置调整
            apple_y <= (random_for_y[4:0] > (BLOCK_Y_MAX - 1)) ? (BLOCK_Y_MAX - 1) : 
                       (random_for_y[5:0] == 0) ? 6'd1 : 
                       (random_for_y[4:0] == BLOCK_Y_MAX / 3) ? (BLOCK_Y_MAX / 3 - 1) : 
                       {1'b0, random_for_y[4:0]};
        end
    end else begin
        // 保持苹果位置不变
        apple_x <= apple_x;
        apple_y <= apple_y;
    end
end

endmodule
